#include <stdio.h>
#include <gmp.h>
#include <time.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char *argv[])
{
	mpf_t Pin, x, y, p, PI;
	unsigned long int n, i;
	gmp_randstate_t state;
	int cmp;
	FILE *arq = fopen("pi.txt", "w+");
	clock_t begin, end;
	
	/* Verifica se o parâmetro n foi passado */
	if (argc != 2) {
    		printf("\nusage: ./mc_seq n_iter");
    		printf("\nn_iter - number of iterations\n");
    		exit(-1);
  	}
  	else 
    		sscanf(argv[1],"%ld",&n); 
    		
    	mpf_set_default_prec(40000000);
  
  	begin = clock();
  
  	/* Inicialização das variáveis */
	mpf_init(Pin);
	mpf_init(PI);
	mpf_init(x);
	mpf_init(y);
	mpf_init(p);
	gmp_randinit_default(state);
	gmp_randseed_ui(state,time(NULL));
	
	/* laço para o cálculo do PI */
	for(i=0; i<n; ++i)
	{
		/* Geração de x e y aleatórios */
		mpf_urandomb(x,state,100);
		mpf_urandomb(y,state,100);
	
		/* x^2 */
		mpf_pow_ui(x,x,2);
	    	/* y^2 */
	    	mpf_pow_ui(y,y,2);
	    	
	    	/* x^2 + y^2 */
		mpf_add(p,x,y);

		/* x^2 + y^2 <= 1.0 */
		cmp = mpf_cmp_d(p,1.0);
		if(cmp <= 0)
			mpf_add_ui(Pin,Pin,1); /* contabiliza o número de pontos dentro do círculo */
	}	
	
	/* PI = Pin/Ptotal */
	mpf_div_ui(PI, Pin, n);
	
	/* PI = 4 * Pin/Ptotal */
	mpf_mul_ui(PI, PI, 4);
	
	/* imprime o valor de PI no arquivo pi.txt */
	if(arq != NULL)
	  mpf_out_str(arq, 10, 0, PI);
	end = clock();

	/* Libera o espaço ocupado pelas variáveis */
	mpf_clear(Pin);
	mpf_clear(x);
	mpf_clear(y);
	mpf_clear(p);
	mpf_clear(PI);
	gmp_randclear(state);
	
	printf("\nTempo do calculo: %lf segundos\n",(double)((end - begin)/CLOCKS_PER_SEC));
	
	fclose(arq);
	
        return 0;               
}

